package 周考0422_scala

import scala.io.Source

object Scala_exam {

  def main(args: Array[String]): Unit = {
    val array = Array(3, 2, 1, 3, 5)
    val array2 = Array(5, 4, 3, 2, 1, 7)
    bubbleSort(array2)
    println(array2.mkString("Array(", ", ", ")"))

    println(sum(array) + " " + array.sum)
    println(sum(array2) + " " + array2.sum)
    println(sum2(4))
  }

  // 01 定义一个方法，将一个数组使用冒泡排序进行升序排序
  def bubbleSort(array: Array[Int]):Unit = {
    if (array == null || array.isEmpty) return
    var breakFlag = false
    for (i <- array.indices if !breakFlag) {
      breakFlag = true
      for (j <- 0 until array.length - i - 1) {
        if (array(j+1)< array(j)) {
          val tmp = array(j)
          array(j) = array(j+1)
          array(j+1) = tmp
          breakFlag = false
        }
      }
    }
  }

  // 02 定义一个方法，使用递归计算1+2+3+...+n的和
  def sum(items: Array[Int], start:Int = 0): Int = {
    if (items.isEmpty) 0
    else if (start == items.length - 1) items(items.length - 1)
    else items(start) + sum(items, start + 1)
  } // 这个理解错题意了

  def sum2(n: Int): Int = if (n == 1) 1 else n + sum2(n - 1)
}

// 03 已知所有的快递公司都有自己的名字， 圆通快递可以发陆运包裹， EMS快递可以发送空运包裹， 顺丰快递既可以发送陆运，
// 也可以发送空运。
// 小明现在需要发送一个包裹， 为小明添加一个发送空运快递的方法， 为小明添加一个发送陆运快递的方法。
object Scala_exam_03 {
  def main(args: Array[String]): Unit = {
    val xiaoming =  Person("小明")
    xiaoming.sendByAir(new YT)
    xiaoming.sendByLand(new EMS)

    xiaoming.sendByAir(new SF)
    xiaoming.sendByLand(new SF)
  }

  trait AirTranslation { def air() }
  trait LandTranslation { def land() }
  abstract class Company(var comName: String)
  class YT extends Company("圆通") with LandTranslation {
    override def land(): Unit = println(s"${comName}使用陆运运送")
  }
  class EMS extends Company("EMS") with AirTranslation {
    override def air(): Unit = println(s"${comName}使用空运运送")
  }
  class SF extends Company("顺丰") with AirTranslation with LandTranslation {
    override def air(): Unit = println(s"${comName}使用空运运送")
    override def land(): Unit = println(s"${comName}使用陆运运送")
  }
  case class Person(var name: String) {
    def sendByLand(air: AirTranslation): Unit = air.air()
    def sendByAir(land: LandTranslation): Unit = land.land()
  }
}

// 04
object Scala_exam_04 {
  def main(args: Array[String]): Unit = {
    // 4.1 读取以上数据，将信息存入到`List[Score]`中
    val source = Source.fromFile("file/0422e/score.txt")
    val scoreList = source.getLines().toList.filter(_.nonEmpty).map(score => {
      val items = score.split(",")
      Score(items(0), items(1), items(2), items(3).toDouble)
    })
    // 4.2 计算所有的成绩中的最高成绩、最低成绩、总成绩和平均成绩
    var max = 0.0
    var min = 200.0
    var sum = 0.0
    scoreList.foreach(item => {
      max = Math.max(max, item.score)
      min = Math.min(min, item.score)
      sum += item.score
    })
    println(s"最高分为: $max, 最低分为: $min, 总成绩为: $sum, 平均成绩为: ${sum / scoreList.length}")
    // 4.3 将集合中的数据，按照成绩降序排列
    scoreList.sortWith(_.score > _.score).foreach(println)
    // 4.4 计算每一个学科的成绩Top3 (选做)
    scoreList.groupBy(_.subject)
      .view
      .mapValues(_.sortWith(_.score > _.score).take(3))
      .foreach(result => {
        println(s"${result._1}成绩前三名同学：")
        for (i <- 1 to result._2.length) {
          val s = result._2(i - 1)
          println(s"$i、${s.name}\t${s.score}")
        }
        println()
      })
    source.close()
  }

  case class Score(var name: String, var gender: String, var subject: String, var score: Double)
}
